perm filename M[AP,SYS]9 blob
sn#033705 filedate 1973-04-11 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00009 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 Definitions.
C00004 00003 Start of program: main loop.
C00006 00004 TOTS
C00009 00005 PRNTNO NXTDG
C00010 00006 START RESTAR STOPIT
C00012 00007 INITAP
C00017 00008 PERCNT
C00019 00009 DOTIM
C00022 ENDMK
C⊗;
;Definitions.
TITLE M
↓C ←1
↓CHAR←2
↓AC1 ←3
↓BOT ←4
↓CNT ←5
↓QUO ←6
↓REM ←7
↓DX ←10
↓BOT ←11
↓BP ←12
↓CHR ←13
↓CMD ←14
↓A ←15
↓B ←16
↓P ←17
↓CR←←15 ↓LF←←12 ↓ALT←←175
PDLEN←30
↓NPNS←←400
PDLIST: BLOCK PDLEN
NAME: BLOCK NPNS*2
COUNT←NAME+1
LTR: BLOCK =32
BLANKS: ASCII / /
DIGITS: BLOCK 4
USERSF: SIXBIT /USERS/
BLOCK 3
IBUF: BLOCK 3
UCMD: IOWD 2,NAME+2
0
WAKEBK: SIXBIT /[-AP-]/
SIXBIT / APSYS/
0
SWAPBK: SIXBIT /DSK/
SIXBIT /DOER/
XWD 'DMP',14 ;start DOER as a phamtom
0
SIXBIT / APSYS/
SIXBIT / APSYS/
SPECS←←4
XSIZE←←3
MAXNBR←←=500
XLEN←MAXNBR*XSIZE+SPECS
INDEX: BLOCK XLEN
XCMD: IOWD XLEN,INDEX
0
DSK17: 17
SIXBIT /DSK/
0
INDEXF: SIXBIT /INDEX/
BLOCK 3
NEWSF: SIXBIT /NEWS/
BLOCK 3
OPDEF INWAIT [TTYUUO 14,]
DEFINE NAMES {
XXX START,START
XXX STOP ,STOPIT
XXX REST ,RESTAR
XXX PER,PERCNT
XXX USERS,TOTS
XXX INIT ,INITAP
XXX DOER,DOER
XXX DOTIM,DOTIM
}
DEFINE XXX(A,B) {<ASCII \A\>}
DISNAM: NAMES
DISLEN←←.-DISNAM
DEFINE XXX(A,B) {B}
DISTAB: NAMES
;Start of program: main loop.
FAILED: OUTSTR [ASCIZ / FAILED!
/]
M: CALLI
OUTSTR [ASCIZ/
*/]
MOVE P,[IOWD PDLEN,PDLIST]
MOVE BP,[POINT 7,CMD] ;READ COMMAND IN AND SAVE IT IN CMD
SETZ CMD,
MOVEI CNT,5 ;COMMAND HAS AT MOST 5 CHARS
JRST GETCH
PUTCH: SOJL CNT,GETCH
CAIL CHR,"A"
TRZ CHR,40 ;make upper case letter
IDPB CHR,BP
GETCH: INCHWL CHR
CAIE CHR,CR ;COMMAND SHOULD END WITH CRLF
JRST PUTCH
INCHWL CHR
CAIE CHR,LF
JRST BADCMD
MOVEI A,DISLEN-1 ;GET LENGTH OF COMMAND TABLE
CAMN CMD,DISNAM(A) ;LOOK FOR COMMAND IN TABLE
JRST @DISTAB(A) ;GO EXECUTE THIS COMMAND
SOJGE A,.-2
BADCMD: OUTSTR [ASCIZ /
?ILLEGAL COMMAND
/]
JRST M
DONE: OUTSTR [ASCIZ /DONE/]
CALLI 12 ;EXIT
;TOTS
BEGIN TOTS
↑TOTS: OUTSTR [ASCIZ/
/]
MOVEI BOT,2
SETZM COUNT
SETZM NAME
INIT 0,10
SIXBIT /DSK/
IBUF
HALT .
SETZM USERSF+3
LOOKUP 0,USERSF
JRST FAILED
GETNAM: SOSG IBUF+2
IN 0,
JRST [ILDB AC1,IBUF+1 ;GET PN
ILDB CNT,IBUF+1 ;GET COUNT FIELD FOR THIS PN
SOS IBUF+2
JUMPN AC1,FIND
JRST GETNAM]
STATO 0,20000
HALT .
RELEAS 0,
EOF: MOVNI AC1,-2(BOT)
HRLM AC1,UCMD
CAILE BOT,2
JRST NNN
OUTSTR [ASCIZ /
NO USERS YET.
/]
JRST DONE
FIND:
MOVE DX,BOT
NEXT: SUBI DX,2
CAME AC1,NAME(DX)
JUMPG DX,NEXT
JUMPN CNT,.+2 ;IS THE COUNT FIELD ZERO?
MOVEI CNT,1 ;YES. IMPLICIT COUNT OF 1.
ADDM CNT,COUNT ;ADD TO TOTAL COUNT OF PNs
JUMPLE DX,INSERT
ADDM CNT,COUNT(DX)
JRST GETNAM
INSERT: CAIL BOT,2*NPNS
JRST [OUTSTR [ASCIZ / TOO MANY PNS. /]
JRST FAILED]
MOVEM AC1,NAME(BOT)
MOVEM CNT,COUNT(BOT)
ADDI BOT,2
JRST GETNAM
PRNTNX: OUTSTR NAME(BOT)
MOVE BP,[POINT 7,DIGITS]
MOVE QUO,COUNT(BOT)
PUSHJ P,NXTDG
MOVEI QUO,CR
IDPB QUO,BP
MOVEI QUO,LF
IDPB QUO,BP
MOVEI QUO,0
IDPB QUO,BP
OUTSTR BLANKS
NNN: SUBI BOT,2
JUMPGE BOT,PRNTNX
INIT 0,17
SIXBIT /DSK/
0
HALT .
SETZM USERSF+1
SETZM USERSF+2
SETZM USERSF+3
ENTER 0,USERSF
JRST [OUTSTR [ASCIZ /
No new file written.
/]
JRST FIN]
OUT 0,UCMD
JRST FIN
RELEAS 0,3
OUTSTR [ASCIZ /
OUT UUO failed for new file.
/]
JRST DONE
FIN: RELEAS 0,
JRST DONE
BEND
;PRNTNO NXTDG
PRNTZR: CAIGE QUO,=10
OUTCHR ["0"] ;PRINT LEADING ZERO
PRNTNO: MOVE BP,[POINT 7,DIGITS]
PUSHJ P,NXTDG
SETZ QUO,
IDPB QUO,BP
OUTSTR DIGITS
POPJ P,
NXTDG: IDIVI QUO,=10
PUSH P,REM
SKIPE QUO
PUSHJ P,NXTDG
POP P,QUO
ADDI QUO,60
IDPB QUO,BP
POPJ P,
;START RESTAR STOPIT
BEGIN STOPIT
↑START: MOVEI AC1,WAKEBK
SETZM WAKEBK+2 ;set wakeup value to NOW
CALLI AC1,400061 ;WAKEME
JRST FAILED
JRST DONE
↑RESTAR:SETOM STARTUP#
JRST STOP1
REST2: OUTSTR [ASCIZ/STOPPED.../]
MOVEI AC1,=8
CALLI AC1,31 ;SLEEP for 8 seconds
OUTSTR [ASCIZ/STARTING.../]
JRST START
↑STOPIT:SETZM STARTUP
MOVEI AC1,WAKEBK
SETOM WAKEBK+2 ;set wakeup value to NEVER
CALLI AC1,400061 ;WAKEME
JRST FAILED
STOP1:
PPIOT 6,-2000 ;move line editor position off screen
CALLI 400001 ;CTLV. turn off duplexing
OUTCHR ["."]
INWAIT
CALLI 400001 ;CTLF. turn on duplexing
PPIOT 6, ;replace line editor in standard position
MOVE BP,[POINT 7,LTR]
MOVEI CNT,5*=32
JRST LOACHR
STOCHR: SOJLE CNT,.+2
IDPB CHR,BP
LOACHR: INCHWL CHR
CAIE CHR,ALT
JRST STOCHR
SETZ CHR,
IDPB CHR,BP
MOVEI A,DONE
SKIPE STARTUP
MOVEI A,REST2
TEST: MAIL 5,[SIXBIT /[-AP-]/
LTR]
JRST FAILED
JRST (A)
OUTSTR [ASCIZ /
[-AP-] does not exist!
/]
JRST FAILED
BEND STOPIT
;INITAP
;Initialize AP system! This should almost never be done!
BEGIN INITAP
ZERO: 0
AZERO: IOWD 1,ZERO
0
↑INITAP:
SETZB A,AC1
CALLI A,24
CALLI AC1,400071
CAME AC1,[' APSYS']
JRST INIT1
CAME A,[' APSYS']
JRST EXIST
;check to see if INDEX or NEWS file exists. if either exists, forget it!
INIT1: OPEN 0,DSK17
JRST DSFAIL
SETZM NEWSF+3
LOOKUP 0,NEWSF
JRST .+2
JRST EXIST
HRRZ A,NEWSF+1 ;get error code
JUMPN A,EXIST
RELEAS 0,
OPEN 1,DSK17
JRST DSFAIL
SETZM INDEXF+3
LOOKUP 1,INDEXF
JRST .+2
JRST EXIST
HRRZ A,INDEXF+1 ;get error code
JUMPN A,EXIST
RELEAS 1,
OUTSTR [ASCIZ/
ARE YOU SURE YOU REALLY WANT TO RESTART THE WHOLE AP SYSTEM?? /]
INCHRW A
CAIE A,"Y"
JRST FAILED
OUTSTR [ASCIZ/
ARE YOU ABSOLUTELY POSITIVE THAT IT IS NECESSARY TO REINITIALIZE IT?? /]
INCHRW A
CAIE A,"Y"
JRST FAILED
OUTSTR [ASCIZ/
OK. HERE GOES!!!! and remember YOU ASKED FOR IT!
/]
;Create NEWS and INDEX files.
OPEN 0,DSK17 ;prepare to create new NEWS file
JRST DSFAIL
SETZM NEWSF+1
SETZM NEWSF+2
SETZM NEWSF+3
OUTSTR [ASCIZ /Making NEWS.../]
ENTER 0,NEWSF ;create NEWS file
JRST [OUTSTR [ASCIZ/ENTER FAILED ON: NEWS/]
JRST FAIL]
OUT 0,AZERO ;write out 1 zero word in NEWS
JRST .+3
OUTSTR [ASCIZ/OUT UUO FAILED FOR: NEWS/]
JRST FAIL
OPEN 1,DSK17 ;prepare to create INDEX file
JRST DSFAIL
SETZM INDEXF+1
SETZM INDEXF+2
SETZM INDEXF+3
OUTSTR [ASCIZ/Making INDEX.../]
ENTER 1,INDEXF ;INDEX file
JRST [OUTSTR[ASCIZ/ENTER FAILED ON: INDEX/]
JRST FAIL]
MOVEI A,XSIZE+SPECS ;initialize special ptrs
MOVEM A,INDEX ;UNDUN
MOVEM A,INDEX+1 ;NEW
MOVEI A,SPECS
MOVEM A,INDEX+2 ;OLD
MOVE A,[XWD 1,4000]
MOVEM A,INDEX+1+XSIZE+SPECS;initialize index information for NEW area
MOVE A,[XWD 10,4000]
MOVEM A,INDEX+1+SPECS ;initialize index information for OLD area
OUT 1,XCMD ;write out INDEX file
JRST .+3
OUTSTR [ASCIZ/OUT UUO FAILED ON: INDEX/]
JRST FAIL
RELEAS 1, ;INDEX file
RELEAS 0, ;NEWS file
OUTSTR [ASCIZ/
NEWS and INDEX done.
Now starting up INITER.
/]
MOVEI A,[ SIXBIT/DSK/
SIXBIT/INITER/
SIXBIT/DMP/
1 ;start up INITER at 1 past starting address
SIXBIT/ APSYS/]
CALLI A,400004 ;SWAP in INITER
OUTSTR [ASCIZ/
CANT FIND INITER!!!
/]
CALLI 12
EXIST: OUTSTR [ASCIZ/
AP SYSTEM CANNOT BE INITIALIZED AT THIS TIME!!!
/]
↑FAIL: CALLI 0
CALLI 12
↑DSFAIL:OUTSTR [ASCIZ/
OPEN FAILED ON DSK!!!
/]
JRST FAIL
BEND INITAP
;PERCNT
;Calculate amt of NEWS used up.
BEGIN PERCNT
↑PERCNT:
OPEN 0,DSK17
JRST DSFAIL
SETZM NEWSF+3
LOOKUP 0,NEWSF
JRST [OUTSTR[ASCIZ/LOOKUP FAILED ON NEWS!/]
JRST FAIL]
RELEAS 0,
HLRE C,NEWSF+3
MOVN C,C
OPEN 1,DSK17
JRST DSFAIL
SETZM INDEXF+3
LOOKUP 1,INDEXF
JRST [OUTSTR[ASCIZ/LOOKUP FAILED ON INDEX!/]
JRST FAIL]
IN 1,XCMD
JRST PC1
OUTSTR [ASCIZ/IN UUO FAILED ON INDEX!/]
JRST FAIL
PC1: RELEAS 1,
MOVE B,INDEX+1
MOVE QUO,INDEX+1(B)
LSH QUO,-13
SUBI QUO,200
IMULI QUO,=100
IDIV QUO,C
PUSHJ P,PRNTNO
OUTSTR [ASCIZ/% NEWS used
/]
CALLI 12
BEND PERCNT
BEGIN DOER
↑DOER: MOVEI QUO,SWAPBK
SWAP QUO,
OUTSTR [ASCIZ\DOER started as job #\]
PUSHJ P,PRNTNO
EXIT
BEND DOER
;DOTIM
DOTIM: OPEN 1,DSK17
JRST DSFAIL
MOVE A,[' APSYS']
MOVEM A,DOTIMF+3
LOOKUP 1,DOTIMF
JRST FAIL
IN 1,DTCMD ;READ IN DOER STATISTICS
JRST .+2
HALT FAIL
RELEAS 1,
OUTSTR [ASCIZ\
DOER data since \]
MOVE A,DODAT ;GET TIME STATISTICS CLEARED
PUSHJ P,DAYTIM ; AND PRINT IT
OUTSTR [ASCIZ\
Total DOER time used: \]
MOVE A,DODAT+1
PUSHJ P,PRTIME
OUTSTR [ASCIZ\
Notification time used: \]
MOVE A,DODAT+2
PUSHJ P,PRTIME
EXIT
DODAT: BLOCK 4
DTCMD: IOWD 4,DODAT
0
DOTIMF: SIXBIT \DOTIM\
BLOCK 3
DAYTIM: HLLM A,(P) ;SAVE DATE ON STACK
ANDI A,-1 ; AND ZERO IT IN A
IDIVI A,=60 ;PUT SECONDS IN B, MINUTES IN A
PUSH P,B ;SAVE SECONDS
IDIVI A,=60 ;PUT MINUTES IN B, HOURS IN A
MOVE QUO,A ;HOURS INTO QUO
PUSHJ P,PRNTZR
OUTCHR [":"]
MOVE QUO,B ;GET MINUTES INTO QUO
PUSHJ P,PRNTZR ;PRINT MINUTES WITH LEADING ZERO, IF LESS THAN 10
OUTCHR [":"]
POP P,QUO ;GET SECONDS
PUSHJ P,PRNTZR ;PRINT SECONDS WITH LEADING ZERO, IF LESS THAN 10
OUTSTR [ASCIZ\ \]
HLRZ A,(P) ;GET DATE BACK
IDIVI A,=31 ;DAYS INTO B, MONTHS INTO A
MOVEI QUO,1(B) ;DAYS INTO QUO
PUSHJ P,PRNTNO
OUTCHR [" "]
IDIVI A,=12 ;MONTHS INTO B, YEARS INTO A
OUTSTR MONTH(B) ;PRINT MONTH
OUTCHR [" "]
MOVEI QUO,=64(A) ;GET YEAR
JRST PRNTNO ;PRINT YEAR, AND RETURN
MONTH: FOR MON IN (Jan,Feb,Mar,Apr,May,June,July,Aug,Sept,Oct,Nov,Dec)
{ASCIZ\MON\
}
PRTIME: IMULI A,=60
IDIVI A,=1000 ;CONVERT TO TICKS
IDIVI A,=60 ;TICKS INTO B, SECS INTO A
PUSH P,B ;SAVE TICKS
IDIVI A,=60 ;SECS INTO B, MINS INTO A
PUSH P,B ;SAVE SECS
IDIVI A,=60 ;MINS INTO B, HOURS INTO A
MOVE QUO,A
PUSHJ P,PRNTZR ;PRINT HOURS
OUTCHR [":"]
MOVE QUO,B
PUSHJ P,PRNTZR ;PRINT MINUTES
OUTCHR [":"]
POP P,QUO
PUSHJ P,PRNTZR ;PRINT SECS
OUTCHR [":"]
POP P,QUO
JRST PRNTZR ;PRINT SECS AND RETURN
END M